///#begin en
//
//  Copyright (c) 2016 MyCamCloud. All rights reserved.
//
///#end

@class TreeListItem;
@class HKSDevicePushItem;

///#begin zh-cn
/**
 *  @brief  HKSServerClient相关回调
 *  @since  v2.4.7.5
 */
///#end
///#begin en
///#end
@protocol HKSServerClientDelegate<NSObject>

///#begin zh-cn
/**
 *  @brief  设备信息更新回调，比如当前用户下的设备信息或者状态发送改变的时候，会进行回调该接口
 *
 *  @return [id]tager HKSServerClient对象
 *  @return [HKSDevicePushItem]aPushItem 更新的对象
 *  @since  v2.4.7.5
 */
///#end
///#begin en
///#end
- (void)serverClient:(id)tager devicePushItem:(HKSDevicePushItem *)aPushItem;
@end


///#begin zh-cn
/**
 *  @class      HKSServerClient
 *  @brief      服务器相关操作的顶级接口，所有服务器相关功能都由此类进行提供
 */
///#end
///#begin en
/**
 *  @class      HKSServerClient
 *  @brief      Server function interface class, all server functions performed by such offers
 */
///#end
@interface HKSServerClient : NSObject{
    
    
    /** @brief  搜索本地摄像头句柄  */
    void                    *hSearchClient;
    
    /** @brief  网络端口映射句柄  */
    void                    *_hPortServer;
    
    /** @brief  报警映射句柄  */
    void                    *_hAlarmServer;
    
    /** @brief  客户端配置数据  */
    NSMutableDictionary     *_customConfigDic;
    
    /** @brief  同步锁  */
    NSCondition             *_ticketCondition;
    
    BOOL                    _isLogouting;
    
    NSString                *_sDeviceName;
    
    BOOL                    _bIfIPV6;
    
    
}

/** @brief  登录模式类型,缺省值：HKS_NPC_D_MON_CLIENT_MODE_SERCER */
@property(nonatomic, assign) HKS_NPC_D_MON_CLIENT_MODE  loginType;

@property(nonatomic, assign) id<HKSServerClientDelegate> delegate;

/** @brief  服务器登录地址 */
@property(nonatomic, retain) NSString       *serverAddress;
/** @brief  服务器登录端口，缺省值：8300 */
@property(nonatomic, assign) int            serverPort;

@property(nonatomic, retain) NSString       *ustServerAddress;
/** @brief  服务器登录端口，缺省值：8300 */
@property(nonatomic, assign) int            ustServerPort;
/** @brief  YES:所有通道名称会根据设备名+通道号显示；NO:所有通道名读取服务器数据显示，缺省值：NO */
@property(nonatomic, assign) BOOL           isCustomChannelName;

/** @brief  服务器登录用户名，缺省值："" */
@property(nonatomic, retain) NSString       *userName;

/** @brief  服务器登录密码，缺省值："" */
@property(nonatomic, retain) NSString       *password;

/** @brief  摄像头设备厂家厂家，缺省值：HKS_NPC_D_MON_DEV_VENDOR_TITLE_Def */
@property(nonatomic, retain) NSString       *deviceVendorFlag;

/** @brief  客户端语言，缺省值：HKS_NPC_D_MON_LANGUAGE_ZH_EN */
@property(nonatomic, retain) NSString       *clientLanguage;

/** @brief  客户端定制标识 */
@property(nonatomic, retain) NSString       *clientCustomFlag;

/** @brief  客户端Token值，控制推送使用 */
@property(nonatomic, retain) NSString       *clientToken;

/** @brief  数据编码，缺省值:utf-8 */
@property(nonatomic, assign) NSStringEncoding stringEncoding;

/** @brief  手机设备唯一标识 */
@property(nonatomic, retain, readonly) NSString     *deviceFlag;

/** @brief  是否开启日志打印 缺省值：NO */
@property(nonatomic, assign) BOOL           logEnable;

/** @brief  是否开启web协议 缺省值：NO */
@property(nonatomic, assign) BOOL           webProtocolEnable;

///#begin zh-cn
/** 
 *  @brief  获取当前SDK版本号
 *
 *  @return [int]版本号
 *  @since  v2.3.4.1
 */
///#end
///#begin en
/**
 *  @brief  get sdk version
 *
 *  @return [int]version
 *  @since  v2.3.4.1
 */
///#end
+ (NSString *)version;

///#begin zh-cn
/**
 *  @brief  清理临时文件夹里面的文件，可以在启动APP的时候调用。
 *
 *  @since  v2.4.8.30
 */
///#end
///#begin en
///#end
+ (void)cleanTempPathFile;

///#begin zh-cn
/**
 *  @brief  获取服务器对象，HKSServerClient为单实例模式
 *
 *  @return [HKSServerClient]返回当前服务器相关操作句柄
 *  @since  v1.0.0.0
 */
///#end
///#begin en
///#end
+ (HKSServerClient *)shareClient;


///#begin zh-cn
/**
 *  @brief  初始化客户端环境，此方法在应用启动时调用一次。
 *
 *  @return [int]调用接口是否成功，参见HKS_NPC_D_MPI_MON_ERROR_*定义
 *  @since  v1.0.0.0
 *  @remark 初始化客户端一些数据、计时器、线程和读取本地文件数据
 */
///#end
///#begin en
///#end
- (int)initClient;

///#begin zh-cn
/**
 *  @brief  释放客户端环境资源，HKSServerClient不需要使用的时候，调用该接口
 *
 *  @return [int]调用接口是否成功，参见HKS_NPC_D_MPI_MON_ERROR_*定义
 *  @since  v1.0.0.0
 */
///#end
///#begin en
///#end
- (int)unInitClient;

///#begin zh-cn
/**
 *  @brief      设置服务器连接参数,其他参数为缺省值
 *
 *  @param[in]  theServerAddress[NSString]  服务器地址
 *  @param[in]  thePort[int]  服务器端口,如:8300
 *  @param[in]  theClientCustomFlag[NSString]  客户端定制标识
 */
///#end
///#begin en
///#end
- (void)setServerConnWithParam:(NSString *)theServerAddress
                          port:(int)thePort
              clientCustomFlag:(NSString *)theClientCustomFlag;


///#begin zh-cn
/**
 *  @brief      设置服务器连接参数,其他参数为缺省值
 *
 *  @param[in]  serverAddress[NSString]  服务器地址
 *  @param[in]  serverPort[int]  服务器端口,如:8300
 *  @param[in]  theDeviceVendorFlag[NSString]   设备厂家类型,HKS_NPC_D_MON_DEV_VENDOR_TITLE_*
 *  @param[in]  theClientLanguage[NSString]     客户端语言,HKS_NPC_D_MON_LANGUAGE_*
 *  @param[in]  theClientCustomFlag[NSString]   客户端定制标识,HKS_NPC_D_MON_VENDOR_TITLE_*
 *  @param[in]  aClientToken[NSString]          客户端Token值，控制推送使用
 */
///#end
///#begin en
///#end
- (void)setServerConnWithParam:(NSString *)theServerAddress
                          port:(int)thePort
              deviceVendorFlag:(NSString *)theDeviceVendorFlag
                clientLanguage:(NSString *)theClientLanguage
              clientCustomFlag:(NSString *)theClientCustomFlag
                   clientToken:(NSString *)aClientToken;

///#begin zh-cn
/**
 *  @brief      设置服务器连接参数,其他参数为缺省值
 *
 *  @param[in]  serverAddress[NSString]  服务器地址
 *  @param[in]  serverPort[int]  服务器端口,如:8300
 *  @param[in]  theDeviceVendorFlag[NSString]  设备厂家类型,HKS_NPC_D_MON_DEV_VENDOR_TITLE_*
 *  @param[in]  theClientLanguage[NSString]  客户端语言,HKS_NPC_D_MON_LANGUAGE_*
 *  @param[in]  theClientCustomFlag[NSString]  客户端定制标识,HKS_NPC_D_MON_VENDOR_TITLE_*
 */
///#end
///#begin en
///#end
- (void)setServerConnWithParam:(NSString *)theServerAddress
                      port:(int)thePort
          deviceVendorFlag:(NSString *)theDeviceVendorFlag
            clientLanguage:(NSString *)theClientLanguage
          clientCustomFlag:(NSString *)theClientCustomFlag IOS_VERSION_DEPRECATED("该接口已过时");

///#begin zh-cn
/**
 *  @brief      设置服务器连接参数,其他参数为缺省值
 *
 *  @param[in]  serverAddress[NSString]         服务器地址
 *  @param[in]  serverPort[int]                 服务器端口,如:8300
 *  @param[in]  theDeviceVendorFlag[NSString]   设备厂家类型,HKS_NPC_D_MON_DEV_VENDOR_TITLE_*
 *  @param[in]  theClientLanguage[NSString]     客户端语言,HKS_NPC_D_MON_LANGUAGE_*
 *  @param[in]  theClientCustomFlag[NSString]   客户端定制标识,HKS_NPC_D_MON_VENDOR_TITLE_*
 *  @param[in]  sGUID[NSString]                 手机的唯一标识
 */
///#end
///#begin en
///#end
- (void)setServerConnWithParam:(NSString *)theServerAddress
                          port:(int)thePort
              deviceVendorFlag:(NSString *)theDeviceVendorFlag
                clientLanguage:(NSString *)theClientLanguage
              clientCustomFlag:(NSString *)theClientCustomFlag
                    deviceGUID:(NSString *)sGUID IOS_VERSION_DEPRECATED("该接口已过时");


///#begin zh-cn
/**
 *  @brief  查询当前连接服务器的状态
 *
 *  @since  v2.4.4.6
 */
///#end
///#begin en
///#end
- (HKS_NPC_D_MPI_MON_CLIENT_CHECK_SRV_CONN_STATE)isServerConnStatus;




///#begin zh-cn
/**
 *  @brief  设置网络状态，需要UI层要网络尽改变时调用该函数设置网络状态，如网络断开或网络连接时调用，该接口主要是加快底层重连速度。
 *
 *  @param[in]  state[int]  网络连接状态，0：断开状态，1：连接状态
 *  @since v2.3.3.1
 */
///#end
///#begin en
///#end
- (void)setClientNetState:(int)state;

- (void)setClientState:(int)state IOS_VERSION_DEPRECATED("请使用setClientNetState接口，该接口已过时");

///#begin zh-cn
/**
 *  @brief  获取客户端断开原因
 *
 *  @return [int]参见NPC_D_MPI_MON_CLIENT_DISCAUSE_*定义
 */
///#end
///#begin en
///#end
- (int)getClientDiscause;

///#begin zh-cn
/**
 *  @brief  查询P2P服务器连接状态
 *
 *  @return [int]查询P2P服务器连接状，0：未连接，1：正在连接，2：已连接
 *  @since v2.3.3.1
 */
///#end
///#begin en
///#end
- (int)getP2pServerState;



///#begin zh-cn
/**
 *  @brief  开启底层服务，连接服务器，启动软件的时候调用该接口，调用该接口之前需要先调用setServerConnWithParam设置服务器地址和端口数据。
 *
 *  @since v2.4.4.1
 */
///#end
///#begin en
///#end
- (void)startServer;

///#begin zh-cn
/**
 *  @brief  停止底层服务
 *
 *  @since v2.4.4.1
 */
///#end
///#begin en
///#end
- (void)stopServer;

///#begin zh-cn
/**
 *  @brief  开启使用UMID直接播放底层服务，连接服务器，启动软件的时候调用该接口，调用该接口之前需要先调用setServerConnWithParam设置服务器地址和端口数据。
 *
 *  @since v2.4.4.1
 */
///#end
///#begin en
///#end
- (void)startUMIDServer;
- (void)stopUMIDServer;

///#begin zh-cn
/**
 *  @brief      登录服务器(该登录为读取本地数据，登录服务器的具体操作SDK在线程里面进行处理)
 *
 *  @param[in]  theUserName[NSString]  服务器登录名
 *  @param[in]  thePassword[NSString]  服务器登录密码
 *  @param[in]  theType[int]  连接类型，请参考HKS_NPC_D_MON_CLIENT_MODE_*定义
 *  @return     [int]返回状态,请参考HKS_NPC_D_MPI_MON_ERROR_*定义
 *  @since v2.3.1.1
 */
///#end
///#begin en
///#end
- (int)loginServerWithUser:(NSString *)theUserName
                  password:(NSString *)thePassword
                      type:(HKS_NPC_D_MON_CLIENT_MODE)theType;

///#begin zh-cn
/**
 *  @brief  登录服务器(该登录为读取本地数据，登录服务器的具体操作SDK在线程里面进行处理)
 *
 *  @return [int]返回状态,请参考HKS_NPC_D_MPI_MON_ERROR_*定义
 *  @since  v1.0.0.0
 */
///#end
///#begin en
///#end
- (int)loginServer;

///#begin zh-cn
/**
 *  @brief  注销服务器，阻塞
 *
 *  @return [int]返回状态,请参考HKS_NPC_D_MPI_MON_ERROR_*定义
 *  @since  v1.0.0.0
 */
///#end
///#begin en
///#end
- (int)logoutServer;
- (int)logoutServerAtBlock:(BOOL)block IOS_VERSION_DEPRECATED("请使用logoutServer接口，该接口已过时");

///#begin zh-cn
/**
 *  @brief  检测服务器连接状态，如果状态连接有问题将会进行重连.
 *
 *  @since  v2.4.4.19
 */
///#end
///#begin en
///#end
- (void)startCheckServerReconnectionLogin;
- (void)startReconnectionLogin;




///#begin zh-cn
/**
 *  @brief      获取设备限制添加权限（即是否允许其它用户添加设备）
 *
 *  @param[in]  theItem[TreeListItem]  获取的设备对象
 *  @param[out] out_pIfDevReg[unsigned int *]  设备是否注册到服务器
 *  @param[out] out_pIfP2pDev[unsigned int *]  是否为P2P设备，必须为P2P设备才有限制功能
 *  @param[out] out_pIfLimitAddPop[unsigned int *]  是否限制添加，TRUE表示不允许其它用户添加，FALSE表示其它用户可以添加
 *  @return [int]返回状态,请参考HKS_NPC_D_MPI_MON_ERROR_*定义
 *  @since      v2.3.3.1
 */
///#end
///#begin en
///#end
- (int)queryServerDevLimitAddPop:(TreeListItem *)theItem
                          devReg:(unsigned int *)out_pIfDevReg
                          p2pDev:(unsigned int*)out_pIfP2pDev
                     limitAddPop:(unsigned int*)out_pIfLimitAddPop IOS_VERSION_DEPRECATED("该接口已过时");

///#begin zh-cn
/**
 *  @brief  设置设备限制添加权限（即是否允许其它用户添加设备）
 *
 *  @param[in] theItem[TreeListItem]  获取的设备对象
 *  @param[in] in_bIfLimitAddPop[int]  是否限制添加，1表示不允许其它用户添加，0表示其它用户可以添加
 *  @return [int]返回状态,请参考HKS_NPC_D_MPI_MON_ERROR_*定义
 *  @since      v2.3.3.1
 */
///#end
///#begin en
///#end
- (HKS_NPC_D_MPI_MON_ERROR)modifyServerDevLimitAddPop:(TreeListItem *)theItem
                                               addPop:(int)in_bIfLimitAddPop IOS_VERSION_DEPRECATED("该接口已过时");



///#begin zh-cn
/**
 *  @brief  获取客户端状态
 *
 *  @return [int]客户端状态，参见HKS_NPC_D_MPI_MON_CLIENT_CONN_STATE_*定义
 *  @since v1.0.0.0
 *  @deprecated 已过时
 */
///#end
///#begin en
///#end
- (int)getClientState IOS_VERSION_DEPRECATED("该接口已过时");

///#begin zh-cn
/**
 *  @brief  获取客户端登录状态
 *
 *  @return [int]客户端登录状态，参见HKS_NPC_D_MPI_MON_CLIENT_CONN_STATE_*定义
 *  @since v2.4.1.1
 */
///#end
///#begin en
///#end
- (int)getClientLoginState IOS_VERSION_DEPRECATED("该接口已过时");


///#begin zh-cn
/**
 *  @brief  查询设备权限
 *
 *  @since  v1.0.0.0
 *  @deprecated 已过时
 */
///#end
///#begin en
///#end
- (BOOL)queryDevicePopedomAtItem:(TreeListItem *)item
                             pop:(int)popId IOS_VERSION_DEPRECATED("该接口已过时");



///#begin zh-cn
/**
 *  @brief  test使用
 *  @param[in] aServerIp[NSString]      服务器地址，必填
 *  @param[in] aPort[int]               服务器端口，必填
 *  @param[in] aCustomFlag[NSString]    APP唯一标识，必填
 *  @param[in] aClientToken[NSString]   APP token，可填写nil
 *
 *  @since  v2.4.10.1
 */
///#end
///#begin en
///#end
- (void)startUMIDServerAtServerInfo:(NSString *)aServerIp
                               port:(int)aPort
                         customFlag:(NSString *)aCustomFlag
                              token:(NSString *)aClientToken;
- (BOOL)authUstServerAtUserId:(NSString *)aIp port:(int)aPort userId:(NSString *)aUserId;
@end
